package net.freestu.sola.web.spider.urlfilter;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import net.freestu.sola.web.global.GlobleVar;

/**
 * 处理IP为地址的URL。测试成功。但暂时不准备在系统中使用。
 * @author 秋刀鱼的滋味
 *
 */
public class IPFilter extends FilterDecorator{

	
		//private String web;//新浪就是sina.百度就是baidu
		
		
		//成都理工大学IP段：202.115.128.1~~~202.115.141.255

		public IPFilter(LinkFilter linkfilter){
			
			super(linkfilter);//在抽象类中进行构造对象。
		}
		
	  public void setState(){//检测状态。对LinkFilter的状态进行设置。

		  
	        String str=linkfilter.getContent();//获取URL。
			int state=linkfilter.getState();//获取状态。
			
			if(state==URLFORBID){//如果不是不能通过的。
				
				return;
			}
			
			
			if(state==URLSTOP){//如果是处于暂停状态的。
				
				int temp=judgeState(str);
				linkfilter.setState(temp);
			}
			
			
			if(state==URLPASS){//如果是处于通过状态。
				
				linkfilter.setState(URLPASS);//至高无上的通行证
			}
			
	  }
	  
	  /**
	   * 判断URL的状态的核心方法,如果想扩展其他的具体过滤类，只需要改写这个方法。
	   * @param str
	   * @return
	   */
	 private int judgeState(String str){//根据URL判断其状态。
	  
		  
		 
		 //1.如果没有匹配有IP则设置为STOP
		 
		//String url="http://202.115.111.111/1www/ss.jsp";
	    //这个正则表达式匹配这个URL
		//这个地方能识别http://202.115.128.240:8080/index.htmz
		 String regex="(http://)\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?(/.*)?";//OK
		 //???这里用IP写的地址只有这种形式吗？
		 //可不可以 202.115.111.111/aaa.jsp
		 
		 if(!str.matches(regex)){
			 
			 return  URLSTOP;
		 }
		 	 
		 else{
			 
		   Pattern p = Pattern.compile("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}");
	       Matcher m = p.matcher(str);
	       String ipd="";
	       
	       if(m.find()){
	    	   //System.out.println("ssssv");
	    	   ipd=m.group();
	       }
	       
	       
	       //System.out.println(ipd);
		   
		 
		 if(isIPWanted(ipd)){
			 
			 return URLPASS;
		 }
		 return URLFORBID;
		 }
	  }
	  	
	  public String getLinkAfterFilter(){//这个函数还需要好好考虑一下需要的段落。
	  	
	  	setState();//先设置状态。
	  	
	  	if(linkfilter.getState()==URLPASS){
				
				return linkfilter.getContent();
				
				}
			if(linkfilter.getState()==URLSTOP){
				
				return linkfilter.getContent();
				}
			
			if(linkfilter.getState()==URLFORBID){
				
				return null;
				}

	      return null;
	  }
	  
		public  void setState(int i){//这个函数主要屈就与MyLink类。
			
			linkfilter.setState(i);
		}
		
		public int getState(){
			
			setState();//设置状态的时候再返回状态。
			
			return linkfilter.getState();//这个地方有点错。这个地方必须设置成反应后的啊
		}
		
		public String getContent(){
			
			return getLinkAfterFilter();//这个函数已经设置状态了。
		}
		
		/**
		 * 判断IP是否在Ip段内。
		 * @param ip
		 * @return
		 */
		private  boolean isIPWanted(String ip){//测试成功。
			
			
			String[] startIP=GlobleVar.IP_START.split("\\.");
			String[] endIP=GlobleVar.IP_END.split("\\.");
			String[] theIP=ip.split("\\.");
			
			int[] startIP1={0,0,0,0};
			int[] endIP1={0,0,0,0};
			int[] theIP1={0,0,0,0};
			
			
			
			//System.out.println(startIP[0]);
			//System.out.println(endIP[0]);
			//System.out.println(theIP[0]);
			
			
			
			startIP1[0]=Integer.valueOf(startIP[0]);
			//System.out.println(startIP1[0]);
			
			
			//将其转换为int
			for(int i=0;i<4;i++){
			
			startIP1[i]=Integer.valueOf(startIP[i]);
			endIP1[i]=Integer.valueOf(endIP[i]);
			theIP1[i]=Integer.valueOf(theIP[i]);
			}
			
			int j=0;
			
			while(true){
				
				if((startIP1[j]>theIP1[j])||(endIP1[j]<theIP1[j])){
					//System.out.println("aaaaaaaaaaaaa");
					return false;
					//break;		
				}
				else if((startIP1[j]<theIP1[j])&&(endIP1[j]>theIP1[j])){
					
					return true;
				}
				else{//三个IP段相等。
					j++;
					continue;
				}
				
				
			}
			
			//return false;
	}
		
		
		
		
		/*
		public static void main(String[] args){
			
			//测试
			//MyLink ml = new MyLink("http://www.aa.edu.cn");//成功！
            MyLink ml=new MyLink("http://202.115.128.222:8080/index.jsp");//居然这种也行。！！！
			
			
			LinkFilter if1=new IPFilter(ml);
			LinkFilter wf = new WebFilter(if1, "cdut.edu.cn");// 按照站点过滤。!!!这个地方以后需要动态分配。

			LinkFilter ctf=new ContentTypeFilter(wf);
			
			// String ss=pf.getLinkAfterFilter();//!! 这个地方有个比较经典的错误！！
			String ss = if1.getLinkAfterFilter();
			
			
			System.out.println(ss);
					
		}*/
		
		
		
		public static void main(String[] args){
			
			
			String url="http://202.115.111.111/index.jsp";
			//String regex="(http://)\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(/.*)?";
			
			
			//System.out.println(url.matches(regex));
			
			
			
			 Pattern p = Pattern.compile("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?");
		     Matcher m = p.matcher(url);
		     if(m.find()){//这里必须先find再group.
		    	 
		     System.out.println(m.group());
		     }
			
		}
		
		
		/*
		public static void main(String[] args){
			
			
			 String ip="202115128111";
			 long ipvalue=Long.valueOf(ip);//这里出现的是int与long  的问题
			 System.out.println(ipvalue);
		}*/
		
		
}